// 从redux导入dispatch的数据类型
import { Dispatch, AnyAction } from 'redux'

// 具体的请求
import {
  getProductTypeApi,
  getProductListApi,
  getProductCategoryApi,
  changeProductShowApi,
  getTemplateApi,
  getRuleApi,
} from '@/utils/request/api'

// action名字
import {
  GET_PRODUCT_TYPE,
  GET_PRODUCT_LIST,
  GET_PRODUCT_CATEGORY,
  CHANGE_PRODUCT_SHOW,
  GET_TEMPLATE,
  GET_RULELIST,
} from './actionNames'

// 数据的类型声明
import {
  IProductState,
  IProductArgs,
  IProductShowChange,
} from '@/types/product'

const defaultValue: IProductState = {
  productType: [],
  productList: {
    list: [],
    count: 0,
  },
  productCategory: [],
  templateList: [],
  ruleList: [],
}

/**
 * 获取商品状态分类
 * @returns
 */
export function getProductType() {
  return {
    type: GET_PRODUCT_TYPE,
    payload: getProductTypeApi(),
  }
}
/**
 * 获取商品列表
 * @param options
 * @returns
 */
export function getProductList(options: IProductArgs) {
  return {
    type: GET_PRODUCT_LIST,
    payload: getProductListApi(options),
  }
}

/**
 * 获取商品类型分类
 * @returns
 */
export function getProductCategory() {
  return {
    type: GET_PRODUCT_CATEGORY,
    payload: getProductCategoryApi(),
  }
}

/**
 * 获取运费模板
 * @returns
 */
export function getTemplate() {
  return {
    type: GET_TEMPLATE,
    payload: getTemplateApi(),
  }
}
/**
 * 获取商品规格列表
 * @returns
 */
export function getRuleList() {
  return {
    type: GET_RULELIST,
    payload: getRuleApi(),
  }
}

/**
 * 切换商品上下架状态
 * @param options
 * @returns
 */
export function changeProductShow(options: IProductShowChange) {
  return {
    type: CHANGE_PRODUCT_SHOW,
    // 请求成功，需要重新获取列表数据
    payload: changeProductShowApi(options),
  }
}

export function productInfo(
  state = defaultValue,
  { type, payload }: AnyAction
) {
  // console.log('store接收到了更新内容，type为: %s; 传入状态为: ', type, payload)
  switch (type) {
    case GET_PRODUCT_TYPE:
      // 保证原有的state不受影响，然后加入新的状态
      return { ...state, productType: payload }
    case GET_PRODUCT_LIST:
      // 保证原有的state不受影响，然后加入新的状态
      return { ...state, productList: payload }
    case GET_PRODUCT_CATEGORY: {
      return { ...state, productCategory: payload }
    }
    case GET_TEMPLATE: {
      return { ...state, templateList: payload }
    }
    case GET_RULELIST: {
      return { ...state, ruleList: payload }
    }
    default:
      return state
  }
}

// 一个文件的代码，在可以拆分的情况下，最好不要超过400行，超过400行就会被eslint给拦截下来，你无法正常提交
// 当一个页面中的逻辑可以被拆分的时候，一定要拆出去，因为太复杂的逻辑不便于维护
